package net.jgrm.common.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.json.JSONUtil;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Hutool 工具类使用示例
 *
 * @author service-common
 * @since 1.0-SNAPSHOT
 */
public class HutoolExampleUtil {

    /**
     * 字符串工具示例
     */
    public static class StringExample {

        /**
         * 验证字符串是否有效
         */
        public static boolean isValidString(String str) {
            return StrUtil.isNotBlank(str);
        }

        /**
         * 格式化字符串
         */
        public static String formatString(String template, Object... params) {
            return StrUtil.format(template, params);
        }

        /**
         * 驼峰转下划线
         */
        public static String camelToSnake(String camelCase) {
            return StrUtil.toUnderlineCase(camelCase);
        }

        /**
         * 下划线转驼峰
         */
        public static String snakeToCamel(String snakeCase) {
            return StrUtil.toCamelCase(snakeCase);
        }
    }

    /**
     * 集合工具示例
     */
    public static class CollectionExample {

        /**
         * 验证集合是否有效
         */
        public static <T> boolean isValidCollection(List<T> collection) {
            return CollUtil.isNotEmpty(collection);
        }

        /**
         * 集合转字符串
         */
        public static <T> String joinCollection(List<T> collection, String separator) {
            return CollUtil.join(collection, separator);
        }

        /**
         * 过滤集合中的偶数
         */
        public static List<Integer> filterEvenNumbers(List<Integer> numbers) {
            return CollUtil.filter(numbers, num -> num % 2 == 0);
        }
    }

    /**
     * 日期工具示例
     */
    public static class DateExample {

        /**
         * 格式化当前日期
         */
        public static String formatCurrentDate(String pattern) {
            return DateUtil.format(new Date(), pattern);
        }

        /**
         * 解析日期字符串
         */
        public static Date parseDate(String dateStr, String pattern) {
            return DateUtil.parse(dateStr, pattern);
        }

        /**
         * 计算年龄
         */
        public static int calculateAge(String birthday) {
            return DateUtil.ageOfNow(birthday);
        }

        /**
         * 获取明天的日期
         */
        public static Date getTomorrow() {
            return DateUtil.offsetDay(new Date(), 1);
        }
    }

    /**
     * JSON工具示例
     */
    public static class JsonExample {

        /**
         * 对象转JSON字符串
         */
        public static String toJsonString(Object obj) {
            return JSONUtil.toJsonStr(obj);
        }

        /**
         * JSON字符串转对象
         */
        public static <T> T fromJsonString(String jsonStr, Class<T> clazz) {
            return JSONUtil.toBean(jsonStr, clazz);
        }

        /**
         * 格式化JSON字符串
         */
        public static String formatJson(Object obj) {
            return JSONUtil.toJsonPrettyStr(obj);
        }
    }

    /**
     * 验证工具示例
     */
    public static class ValidationExample {

        /**
         * 验证邮箱格式
         */
        public static boolean isValidEmail(String email) {
            return Validator.isEmail(email);
        }

        /**
         * 验证手机号格式
         */
        public static boolean isValidMobile(String mobile) {
            return Validator.isMobile(mobile);
        }

        /**
         * 验证是否为数字
         */
        public static boolean isNumber(String str) {
            return Validator.isNumber(str);
        }

        /**
         * 验证URL格式
         */
        public static boolean isValidUrl(String url) {
            return Validator.isUrl(url);
        }
    }

    /**
     * 加密工具示例
     */
    public static class CryptoExample {

        /**
         * MD5加密
         */
        public static String md5(String input) {
            return SecureUtil.md5(input);
        }

        /**
         * SHA256加密
         */
        public static String sha256(String input) {
            return SecureUtil.sha256(input);
        }
    }

    /**
     * Bean工具示例
     */
    public static class BeanExample {

        /**
         * Bean属性复制
         */
        public static <T> T copyProperties(Object source, Class<T> targetClass) {
            return BeanUtil.copyProperties(source, targetClass);
        }

        /**
         * Bean转Map
         */
        public static Map<String, Object> beanToMap(Object bean) {
            return BeanUtil.beanToMap(bean);
        }

        /**
         * Map转Bean
         */
        public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {
            return BeanUtil.mapToBean(map, beanClass, false);
        }
    }

    /**
     * 随机工具示例
     */
    public static class RandomExample {

        /**
         * 生成随机整数
         */
        public static int randomInt(int min, int max) {
            return RandomUtil.randomInt(min, max);
        }

        /**
         * 生成随机字符串
         */
        public static String randomString(int length) {
            return RandomUtil.randomString(length);
        }

        /**
         * 生成随机数字字符串
         */
        public static String randomNumbers(int length) {
            return RandomUtil.randomNumbers(length);
        }

        /**
         * 生成UUID
         */
        public static String randomUUID() {
            return IdUtil.randomUUID();
        }
    }
}